# -*- encoding: utf-8 -*-
# -*- coding: utf-8 -*-

'''
@author: 5605 * António Delgado
@date: 15 de Outubro de 2013
@obs: Trabalho de Linguagens de Programação em Python
      Docente: Prof. Jasnau Caeiro
'''

import xlrd
import sqlite3
from sqlalchemy import *
from sqlalchemy import Column, String, Integer, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Colocados(Base):
    '''
    Classe que contêm a tabela e os seus campos para serem introduzidos 
    na base de dados.
    
    @param Base: este parametro contêm o "declarative_base()" que é 
                 um atributo do sqlalchemy
    '''
    
    __tablename__ = "Colocados"
    id              = Column(Integer, primary_key=True)
    cod_instituicao = Column(Integer)
    cod_curso       = Column(Integer)
    instituicao     = Column(String)
    curso           = Column(String)
    grau            = Column(String)
    vagas_iniciais  = Column(Integer)
    colocados13_14  = Column(Integer)
    nota_ultimo     = Column(Integer)
    vagas_sobrantes = Column(Integer)
    
 
    def __init__(self, cod_instituicao, cod_curso, instituicao, curso,
                    grau, vagas_iniciais,colocados13_14, nota_ultimo,
                    vagas_sobrantes):
        '''Constructor''' 
        self.cod_instituicao = cod_instituicao
        self.cod_curso = cod_curso
        self.instituicao = instituicao
        self.curso = curso
        self.grau = grau
        self.vagas_iniciais = vagas_iniciais
        self.colocados13_14 = colocados13_14
        self.nota_ultimo = nota_ultimo
        self.vagas_sobrantes = vagas_sobrantes
    pass
    
class Basedados:
    '''
    Classe que contêm todos os métodos que vão dar origem à base de dados 
    em sqlalchemy, com os dados introduzidos.
    '''
    
    def criarbd(self):
        '''
        Neste método vamos criar a base de dados e returna-la.
        O "echo=True" serve para mostrar as informações relativas 
        à base de dados na inserção dos dados.
        '''
        
    
        db = create_engine('sqlite:///colocados_2013_2014.db', echo=False)
        Base.metadata.drop_all(db)
        metadata = Base.metadata
        metadata.create_all(db)
        return db
    
    def abrirexcel(self):
        '''
        Neste método vamos abrir o livro Excel e depois vamos para a página "Resultados".
        '''
        book = xlrd.open_workbook("cna131fresultados.xls")
        view = book.sheet_by_name(u'Resultados')
        return view
    
    
    def inserirdados(self, db, view):
        '''
        Neste método vamos inserir os dados do Excel na base de dados.
        
        @param db: este parametro é o que é retornado da criação da base de dados
        
        @param view: este parametro é o que é retornado do abrir excel que 
                     vai abrir o ficheiro .XLS e ir para o separador Resultados
        '''
        Session = sessionmaker(bind = db)
        session = Session()
        primeiralinha = 3
        ultimalinha = view.nrows-2
        
        
        cod_instituicao = ''
        cod_curso = ''
        instituicao = ''

        for i in xrange(primeiralinha, ultimalinha):#for que percorre todo o ficheiro xls
        
            if view.cell_value(i,0) != "":
                cod_instituicao = view.cell(i,0).value
            else:
                cod_instituicao = cod_instituicao
            
            if view.cell_value(i,1) != "":
                cod_curso = view.cell(i,1).value
            else:
                cod_curso = cod_curso

            if view.cell_value(i,2) != "":
                instituicao = view.cell(i,2).value
            else:
                instituicao = instituicao
            
            curso = view.cell(i,3).value
            grau = view.cell(i,4).value
            vagas_iniciais = view.cell(i,5).value
            colocados13_14 = view.cell(i,6).value
            nota_ultimo = view.cell(i,7).value
            vagas_sobrantes = view.cell(i,8).value
            
            
            obj = Colocados(cod_instituicao, cod_curso, instituicao, curso,
                            grau, vagas_iniciais, colocados13_14, nota_ultimo,
                            vagas_sobrantes)
            
            session.add(obj)
        session.commit()
        pass
    
    def querydados(self, db):
        '''
        Método que passa toda a informação da base de dados 
        para um lista.
        
        @param db: este parametro é o que é retornado da criação da base de dados
                   e faz a ligação com a mesma para poder passar para uma lista os dados
        '''
        
        Session = sessionmaker(bind = db)
        session = Session()
        
        dadosquery = session.query(Inscritos)
        dados = []
        
        for i in dadosquery:
            
            dados_completos = (i.cod_instituicao, i.cod_curso, i.instituicao, i.curso,
                                i.grau, i.vagas_iniciais, i.colocados13_14, i.nota_ultimo,
                                i.vagas_sobrantes)
            
            dados.append(dados_completos)
            pass
        return dados
        
    






    
